<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>

    // 先判断，不是对象或者等于null就返回false，然后获取对象的原型对象，使用Object.getPrototypeOf方法，如果原型对象是null就返回false
    // 然后对比原型对象是否等于右侧的构造函数的prototype，等于就返回true，不等于就顺着原型链查找，直到相等或者是null的情况，

        function myInstanceof(left,right){
            if(typeof left !== 'object' || left === null) return false
            let proto = Object.getPrototypeOf(left)
            while(true){
                if (proto === null) return false
                if (proto === right.prototype) return true
                proto = Object.getPrototypeOf(proto)
            }
        }

        // ===== 测试用例 =====
        // 1. 基本类型验证
        console.log("1. 基本类型测试:")
        console.log("数字:", myInstanceof(123, Number))          // false (基本类型非对象)
        console.log("字符串:", myInstanceof("abc", String))      // false

        // 2. null/undefined 验证
        console.log("\n2. null/undefined测试:")
        console.log("null:", myInstanceof(null, Object))         // false
        console.log("undefined:", myInstanceof(undefined, Object)) // false

        // 3. 直接原型匹配
        console.log("\n3. 直接原型匹配:")
        const obj = {};
        console.log("普通对象:", myInstanceof(obj, Object))      // true

        // 4. 原型链继承验证
        console.log("\n4. 原型链继承测试:")
        function Parent() {}
        function Child() {}
        Child.prototype = new Parent();
        const child = new Child();
        console.log("child instanceof Parent:", myInstanceof(child, Parent)) // true
        console.log("child instanceof Object:", myInstanceof(child, Object)) // true

        // 5. 内置对象验证
        console.log("\n5. 内置对象测试:")
        console.log("数组:", myInstanceof([], Array))            // true
        console.log("日期对象:", myInstanceof(new Date(), Date)) // true

        // 6. 边界情况
        console.log("\n6. 边界测试:")
        console.log("Object.create(null):", myInstanceof(Object.create(null), Object)) // false (无原型链)
</script>
</html>